import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/auth' //  从cookie中获取token
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // 进度条配置

const whiteList = ['/login', 'auth-redirect', '/401', '/404'] // no redirect whitelist

// 用户登录成功之后，在全局钩子router.beforeEach中拦截路由，判断是否已获得token
// 在获得token之后,就要去获取用户的基本信息了
router.beforeEach(async(to, from, next) => {
  NProgress.start()
  // 设置当前网页标题
  document.title = getPageTitle(to.meta.title)
  const hasToken = getToken() //  从cookie中获取token
  // console.log(hasToken)
  if (whiteList.indexOf(to.path) !== -1) { // 如果目标跳转路由存在的话，做些什么?
    // 浏览器中存在token，当项目初始化进入登录页面的时候，直接重定向到主页
    // 比如说  登录进去主页，此时token就会存在cookie里面，
    // 当关闭浏览器重新打开时，就会直接跳转到主页，不会进行再次登录，因为cookie中本身存在token
    if (to.path === '/login' && hasToken) {
      next({ name: 'welcome' })
    }
    next()
  } else if (hasToken) { // 有token的情况下
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else { // 确定用户是否已通过getInfo获得其权限角色
      const hasMenuList = store.getters.menuList && store.getters.menuList.length > 0
      // console.log(hasMenuList)
      if (hasMenuList) {
        next()
      } else {
        try { // 获取菜单信息，然后存在vuex
          const { aaa } = await store.dispatch('user/getMenuList')
          // console.log(aaa) // [{},{},{},{}] 26个菜单 OK
          await store.dispatch('permission/generateRoutes', aaa) // 生成可访问的路由表
          if (aaa.length === 0) { // 如果生成的菜单数组为空跳，转到401页面
            next({ path: '/401', replace: true })
          } else {
            store.dispatch('user/getDistrinctTree').catch(error => {
              Message({
                type: 'error',
                message: '获取机构列表失败:' + error
              })
            })
            store.dispatch('user/getLogisticsLists').catch(error => {
              Message({
                type: 'error',
                message: '获取物流公司列表失败:' + error
              })
            })
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
          }
        } catch (error) {
          // 移除token重新返回登录页面
          await store.dispatch('user/resetToken')
          Message.error(error || 'has ERROR')
          next(`/login/?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else { // 无token的情况下
    if (whiteList.indexOf(to.path) !== -1) {
      next() // 在免登录白名单，直接进入
    } else {
      store.dispatch('user/resetToken')
      // 没有访问权限的其他页将重定向到登录页
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 完成进度条
  NProgress.done()
})
